#ifndef SOBJC_COMMONS_MEMORY_H
#define SOBJC_COMMONS_MEMORY_H

#include <sobjc-commons/port.h>
#include <gc/gc.h>

typedef void *(*objc_malloc_f)(size_t);
typedef void *(*objc_realloc_f)(void *, size_t);
typedef void *(*objc_calloc_f)(size_t, size_t);
typedef void (*objc_free_f)(void *);

OBJC_EXPORT objc_malloc_f               objc_malloc_callback;
OBJC_EXPORT objc_malloc_f               objc_malloc_atomic_callback;
OBJC_EXPORT objc_realloc_f              objc_realloc_callback;
OBJC_EXPORT objc_calloc_f               objc_calloc_callback;
OBJC_EXPORT objc_free_f                 objc_free_callback;

#define objc_malloc(n)                  objc_malloc_callback(n)
#define objc_malloc_atomic(n)           objc_malloc_atomic_callback(n)
#define objc_realloc(p,n)               objc_realloc_callback(p,n)
#define objc_calloc(n,size)             objc_calloc_callback(n,size)
#define objc_free(p)                    objc_free_callback(p)

#define objc_set_malloc_callback(f)     objc_malloc_callback=f
#define objc_set_malloc_atomic_callback(f)     objc_malloc_atomic_callback=f
#define objc_set_realloc_callback(f)    objc_realloc_callback=f
#define objc_set_calloc_callback(f)     objc_calloc_callback=f
#define objc_set_free_callback(f)       objc_free_callback=f

OBJC_EXPORT void objc_enable_gc();

#endif /* SOBJC_COMMONS_MEMORY_H */

